package com.xzc.json;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.xzc.pojo.Person;
import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 徐州城
 * @version 1.0
 */
public class JsonTest {

    //3.1、javaBean和json的互换
    @Test
    public void test1(){
        Person person = new Person(1,"国哥号好帅");
        //创建Gson对象实例
        Gson gson = new Gson();
        //toJson() 可以把java对象转换成为json字符串
        String personJsonString = gson.toJson(person);
        System.out.println(personJsonString);
        //fromJson() 把json字符串转换为Java对象
        // 第一个参数是json字符串
        // 第二个参数转换回去的Java对象类型
        Person person2 = gson.fromJson(personJsonString, Person.class);
        System.out.println(person2);
    }

    //3.2、List 和 json 的互转
    @Test
    public void test2(){
        List<Person> personList = new ArrayList<>();
        personList.add(new Person(1,"国哥"));
        personList.add(new Person(2,"康师傅"));

        Gson gson = new Gson();
        //把list 转换为json字符串
        String personListJsonString = gson.toJson(personList);
        System.out.println(personListJsonString);

        List<Person> list  = gson.fromJson(personListJsonString, new PersonListType().getType());
        Person person = list.get(0);
        System.out.println(personListJsonString);
    }

    //3.3、map 和 json 的互转
    @Test
    public void test3(){
        Map<Integer,Person> personMap = new HashMap<>();
        personMap.put(1,new Person(1,"国哥好帅"));
        personMap.put(2,new Person(2,"康师傅好帅"));

        Gson gson = new Gson();
        //把map集合转化成为json字符串
        String personMapJsonString = gson.toJson(personMap);
        System.out.println(personMapJsonString);

        //需要创建类继承TypeToken 才能使用
        //Map<Integer,Person> personMapType = gson.fromJson(personMapJsonString, new PersonMapType().getType());
        //使用匿名内部类 可以不用编写
        Map<Integer,Person> personMapType = gson.fromJson(personMapJsonString, new TypeToken<HashMap<Integer,Person>>(){}.getType());


        System.out.println(personMapType);
        Person p = personMapType.get(1);
        System.out.println(p);
    }
}
